package controlers
{
    import events.SillajConnectionEvent;
    
    import flash.events.Event;
    import flash.events.EventDispatcher;
    import flash.events.MouseEvent;
    import flash.filesystem.File;
    import flash.filesystem.FileMode;
    import flash.filesystem.FileStream;
    
    import models.SillajModel;
    
    import utils.Notifieur;
    
    import views.OptionView;
    
    public class OptionController extends EventDispatcher
    {
        private var view:OptionView ;
        
        private var model:SillajModel ;
        
        private var sillajUser:String ;
        private var sillajPassword:String ;
        private var sillajURL:String ; 
        
        
        
        /*gestion des parametres de connexion*/
        private var paramFile:File ;
        private var fileStream:FileStream ;
        
        
        
        /**
        * constructeur
        * dès la création de la vue option, on contrôle les saisies, 
        * puis on test une connexion
        * si ok, on prévient l'application
        * si non, on prévient l'utilisateur
        */ 
        public function OptionController( view:OptionView )
        {
            this.view = view ;

            model = new SillajModel(  ) ;
            
            addListeners( ) ;
            
            //recuperation des infos de connexion dans le fichier de parametrage
            loadParam( ) ;

            if( checkFieldsFilled( )  )
            {
                model.user               = this.sillajUser ;
                model.password       = this.sillajPassword ;
                model.urlSillajFolder = this.sillajURL ;
                      

                model.checkConnection( ) ;
            }
        }
        
        private function addListeners( ):void
        {
            model.addEventListener( SillajConnectionEvent.LOGIN_SUCCESS, login_succes_handler ) ;
            model.addEventListener( SillajConnectionEvent.LOGIN_FAIL, login_fail_handler ) ;
            
            view.bt_valider.addEventListener( MouseEvent.CLICK, bt_valider_clickHandler ) ;
            
            view.optionBg.addEventListener( MouseEvent.MOUSE_DOWN, optionBg_mouseDownHandler ) ;
        }
        
        
        /**
        * si le fichier des parametrages existe, il est chargé, sinon on en créé un vide
        */ 
        private function loadParam( ):void
        {
            paramFile = File.applicationStorageDirectory.resolvePath( "sillaj.xml" ) ;
            
            fileStream = new FileStream() ;
            
            //ouverture en lecture si le fichier existe, en écriture pour création dans le cas contraire
            if( paramFile.exists )
            {
                fileStream.open( paramFile, FileMode.READ ) ;     
               
                var xml:XML = XML( fileStream.readUTFBytes( fileStream.bytesAvailable ) ) ;
              
                view.sillajURL.text          = xml.url ;
                view.sillajUser.text         = xml.user ;
                view.sillajPassword.text = xml.psw ;           
            }
            else
            {
                createEmptyParamFile( ) ;
            }
                                   
            fileStream.close() ;            
        }
        
        
        /**
        * creation d'un fichier de parametrage vide
        */
        private function createEmptyParamFile( ):void
        {
                fileStream.open( paramFile, FileMode.UPDATE ) ;

                var xml:XML = <options><url></url><user></user><psw></psw></options>; 
 
                var outputString:String = '<?xml version="1.0" encoding="utf-8"?>\n'; 
                outputString += xml.toXMLString(); 
     
                fileStream.writeUTFBytes( outputString );             
        }
        
        
        /**
        * enregistrement des parametres dans le fichier
        */
        private function saveParam( ):void
        {
                fileStream.open( paramFile, FileMode.WRITE ) ;
 
                var strXml:String = "<options><url>" + view.sillajURL.text + "</url>" ;
                strXml += "<user>" + view.sillajUser.text +"</user>" ; 
                strXml += "<psw>" + view.sillajPassword.text +"</psw></options>" ; 
 
                var outputString:String = '<?xml version="1.0" encoding="utf-8"?>\n'; 
                outputString += strXml ; 
     
                fileStream.writeUTFBytes( outputString );               
        } 
        
        
        /**
        * contrôle la validité des paramètres saisis
        */ 
        private function bt_valider_clickHandler( e:MouseEvent ):void
        {
            if( isParamChanged( )  )
            {
                if( checkFieldsFilled( ) )
                {                
                    saveParam( ) ;
                    model.user                = sillajUser ;
                    model.password        = sillajPassword ;
                    model.urlSillajFolder = sillajURL ;
    
                    model.checkConnection( ) ;    
                }
            }
            else
            {
                //aucun changement, on prévient le controller principal
                Notifieur.getInstance().dispatchEvent( new Event( "showFront" ) ) ;
            }
        }
                
        /** 
        * controle si les paramètres ont changés
        * @return true or false Boolean
        */         
        private function isParamChanged( ):Boolean
        {
            if( view.sillajUser.text != this.sillajUser 
                    || view.sillajPassword.text != this.sillajPassword 
                    || view.sillajURL.text != this.sillajURL )
            {
               return true ;
            }
            
            return false ;
        }                
                
                
        
        /**
        * les options sont correctes, on prévient l'application
        */ 
        private function login_succes_handler( e:SillajConnectionEvent ):void
        {
            Notifieur.getInstance().dispatchEvent( new SillajConnectionEvent( SillajConnectionEvent.LOGIN_SUCCESS, this.sillajUser, this.sillajPassword, this.sillajURL ) ) ;
        }
        
        /**
        * echec de connexion à sillaj
        */ 
        private function login_fail_handler( e:SillajConnectionEvent ):void
        {
            view.labelError.text = e.sillajErrorMessage  ;
        }
        
        
        
        /**
        * controle que les champs ont bien été remplis
        */ 
        private function checkFieldsFilled( ):Boolean
        {
            view.labelError.text = '' ;

           if( view.sillajUser.text == '' )
           {
               view.labelError.text = "fill user" ;
               view.sillajUser.setFocus( ) ;
               return false ;
           }
           
           if( view.sillajPassword.text == '' )
           {
               view.labelError.text = "fill password" ;
               view.sillajPassword.setFocus( ) ;
               return false ;
           }
           
           if( view.sillajURL.text == '' )
           {
               view.labelError.text = "fill url sillaj folder" ;
               view.sillajURL.setFocus( ) ;
               return false ;
           }
           
           
           this.sillajUser         = view.sillajUser.text ;
           this.sillajPassword = view.sillajPassword.text ;
           this.sillajURL          = view.sillajURL.text ;
                      
           return true ; 
        }


        /**
        * gestion du drag en informant l'application
        */ 
        private function optionBg_mouseDownHandler( e:MouseEvent ):void
        {
            view.dispatchEvent( new Event( "startDrag" ) ) ;
        }


    }
}